/*
 * 易族智汇（北京）科技有限公司 版权所有。
 * 未经许可，您不得使用此文件。
 * 官方地址：www.javamall.com.cn
 */
package com.enation.app.javashop.core.handler;

import com.enation.app.javashop.framework.context.request.ThreadContextHolder;
import com.enation.app.javashop.framework.security.model.TokenConstant;
import feign.RequestInterceptor;
import feign.RequestTemplate;

import javax.servlet.http.HttpServletRequest;
import java.util.*;

/**
 * feign拦截器
 *
 * @author fk
 * @version v2.0
 * @since v7.2.0
 * 2020年3月3日 上午9:56:03
 */
public class FeignInterceptor implements RequestInterceptor {


    @Override
    public void apply(RequestTemplate requestTemplate) {

        Map<String, String> parameters = getParameters();
        Map<String, Collection<String>> querys = requestTemplate.queries();
        for (String parameter : parameters.keySet()) {

            if (querys != null && querys.containsKey(parameter)) {
                continue;
            }
            requestTemplate.query(parameter, parameters.get(parameter));
        }
        HttpServletRequest request = ThreadContextHolder.getHttpRequest();
        //跨服务调用，可能丢失上下文信息，所以携带到头里
        if (request != null) {
            requestTemplate.header(TokenConstant.HEADER_STRING, request.getHeader(TokenConstant.HEADER_STRING));
            //服务间传递host头信息
            requestTemplate.header(TokenConstant.HOST, request.getServerName());
            //传递是否微信打开
            requestTemplate.header("User-agent", request.getHeader("User-agent"));
        }
    }


    /**
     * 返回所有query中的数据
     *
     * @return
     */
    private Map<String, String> getParameters() {
        HttpServletRequest request = ThreadContextHolder.getHttpRequest();
        if (request == null) {
            return new HashMap<>();
        }
        Map<String, String> map = new LinkedHashMap<>();
        Enumeration<String> enumeration = request.getParameterNames();
        while (enumeration.hasMoreElements()) {
            String key = enumeration.nextElement();
            String value = request.getParameter(key);
            map.put(key, value);
        }
        return map;
    }
}
